package com.shell.governor.modules.util;

import com.shell.bee.base.exception.UnCheckException;
import com.shell.bee.base.message.keyword.BaseKeyword;
import com.shell.bee.base.utils.SpringContextUtil;
import com.shell.bee.base.utils.StringUtil;
import com.shell.bee.base.utils.SystemUtil;
import com.shell.framework.utils.CommonDataUtil;
import com.shell.framework.utils.SysDateUtil;
import com.shell.governor.modules.po.PubMessage;
import com.shell.governor.modules.po.PubMessageTemplate;
import com.shell.governor.modules.service.PubMessageService;
import com.shell.governor.modules.service.PubMessageTemplateService;
import com.shell.governor.user.po.PubUser;
import com.shell.governor.user.service.PubUserService;
import com.shell.sms.SMSResponse;
import com.shell.sms.util.SMSHelper;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MessageSender {
	public static final Log logger = LogFactory.getLog(MessageSender.class);
	private static boolean isInit = false;
	public static PubMessageService messageService;
	public static PubMessageTemplateService messageTemplateService;
	public static PubUserService userService;

	public static void initSender() {
		if (!isInit) {
			messageService = (PubMessageService) SpringContextUtil.getBean("pubMessageService");
			messageTemplateService = (PubMessageTemplateService) SpringContextUtil.getBean("messageTemplateService");
			userService = (PubUserService) SpringContextUtil.getBean("pubUserService");
			isInit = true;
		}
	}

	public static void sendMessageByRoleCode(String[] roleCodes, String senderId, String messageTemplateId,
			BaseKeyword keyword, String entId) {
		initSender();
		List<String> receiverIds = messageService.getReceviers(roleCodes, entId);
		sendMessage(receiverIds, senderId, messageTemplateId, keyword);
	}

	public static void sendMessageByTmpl(String senderId, String messageTemplateId, BaseKeyword keyword, String entId) {
		initSender();
		List<String> receiverIds = messageService.getReceviersByTemplateId(messageTemplateId, entId);
		sendMessage(receiverIds, senderId, messageTemplateId, keyword);
	}

	public static void sendMessage(List<String> receiverIds, String senderId, String messageTemplateId,
			BaseKeyword keyword) {

		if ((receiverIds == null) || (receiverIds.size() == 0)) {
			logger.error("��������������������������");
			return;
		}
		if (StringUtil.emptyAndNull(senderId)) {
			senderId = CommonDataUtil.getUserId();
		}
		if (StringUtil.emptyAndNull(messageTemplateId)) {
			logger.error("������������������������");
			return;
		}
		if (keyword == null) {
			logger.error("��������������������������");
			return;
		}
		PubMessageTemplate tmpl = (PubMessageTemplate) messageTemplateService.selectByKey(messageTemplateId);
		if (tmpl == null) {
			throw new UnCheckException("��������������");
		}
		if ((StringUtil.notEmpty(tmpl.getSystemMsg())) && (tmpl.getSystemMsg().equals("0"))
				&& (StringUtil.notEmpty(tmpl.getSms())) && (tmpl.getSms().equals("0"))) {
			logger.warn("[" + messageTemplateId + "]������������������������");
			return;
		}
		for (String receiverId : receiverIds) {
			logger.info("����(" + messageTemplateId + ")����������������----��������ing");
			PubUser user = (PubUser) userService.selectByKey(receiverId);
			if (user == null) {
				logger.error("������[" + receiverId + "],������");
			} else {
				if ((StringUtil.notEmpty(tmpl.getSystemMsg())) && (tmpl.getSystemMsg().equals("1"))) {
					String contents = MessageTemplateHelper.genMsgContent(tmpl, keyword);
					PubMessage message = new PubMessage();
					message.setContent(contents);
					String title = MessageTemplateHelper.genMsgTitle(tmpl.getTitle(), keyword);
					message.setTitle(title);
					message.setMsgId(SystemUtil.getUUID());
					message.setSenderId(senderId);
					message.setSendTime(SysDateUtil.getSystemDateTime());
					message.setReceiverId(receiverId);
					logger.info("��" + user.getUserName() + "������������");
					logger.info("����������:" + tmpl.getTitle());
					logger.info("����������:\r\r" + contents);
					messageService.save(message);
				}
				if ((StringUtil.notEmpty(tmpl.getSms())) && (tmpl.getSms().equals("1"))) {
					logger.info("��" + user.getUserName() + "����������");
					sendMessageToPhone(user.getPhoneNo(), senderId, messageTemplateId, keyword);
				}
			}
		}
	}

	public static SMSResponse sendMessageToPhone(String phone, String senderId, String messageTemplateId,
			BaseKeyword keyword) {
		SMSResponse response = new SMSResponse();
		initSender();
		if (StringUtil.empty(phone)) {
			logger.error("��������������������");
			response.setSuccess(false);
			response.setErrMsg("��������������������");
			return response;
		}
		try {
			PubMessageTemplate messageTemplate = messageTemplateService.selectTemplate(messageTemplateId);
			if ((StringUtil.notEmpty(messageTemplate.getSms())) && (messageTemplate.getSms().equals("1"))) {
				String contents = MessageTemplateHelper.genMsgContent(messageTemplate, keyword);
				logger.info("����������������:" + phone);
				logger.info("��������:" + contents);
				Map<String, String> replaceKeyword = MessageTemplateHelper.parseParams(keyword);
				response = SMSHelper.sendSMS(messageTemplate.getMsgPlatId(), contents, replaceKeyword,
						new String[] { phone });
			}
		} catch (Exception e) {
			logger.warn(phone + "������������", e);
			response.setSuccess(false);
			response.setErrMsg(phone + "������������" + e.getMessage());
			return response;
		}
		return response;
	}
}